package xml.laberinto;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import xml.adapter.PosicionAdapter;

import dominio.Laberinto;
import dominio.Nodo;
import dominio.Sentido;

@XmlRootElement(name="laberinto")
@XmlType (propOrder={"nodos", "inicioFantasmas", "inicioPacman", "nodoAlto", "nodoAncho", "alto", "ancho"})
public class XmlLaberinto {
	
	private Laberinto laberinto;
	
	private String inicioPacman;
	private String inicioFantasmas;
	
	private List<XmlNodo> nodos;
	
	public XmlLaberinto() {
		this.nodos = new ArrayList<XmlNodo>();
		this.laberinto = new Laberinto();
	}
	
	public XmlLaberinto(Laberinto laberinto) {
		this.laberinto = laberinto;
		this.inicioFantasmas = PosicionAdapter.adapt(this.laberinto.getPosInicialFantasmas());
		this.inicioPacman = PosicionAdapter.adapt(this.laberinto.getPosInicialPacman());
		this.nodos = new ArrayList<XmlNodo>();
		for (Nodo nodo : this.laberinto.getNodos()) {
			this.nodos.add(new XmlNodo(nodo, laberinto));
		}
	}
	
	@XmlAttribute
	public Integer getAncho() {
		return this.laberinto.getAncho();
	}	
	public void setAncho(Integer ancho) {
		this.laberinto.setAncho(ancho);
	}

	@XmlAttribute
	public Integer getAlto() {
		return this.laberinto.getAlto();
	}
	public void setAlto(Integer alto) {
		this.laberinto.setAlto(alto);
	}

	@XmlAttribute
	public String getNodoAncho() { //TODO lalalalalalalallaaaaaaaaaaaaaaaaaaaaaaaa
		return this.laberinto.getNodoAncho().toString();
	}
	public void setNodoAncho(String nodoAncho) {
		this.laberinto.setNodoAncho(new Integer(nodoAncho));
	}

	@XmlAttribute
	public Integer getNodoAlto() {
		return this.laberinto.getNodoAlto();
	}
	public void setNodoAlto(Integer nodoAlto) {
		this.laberinto.setNodoAlto(nodoAlto);
	}
	
	@XmlAttribute
	public String getInicioPacman() {
		return inicioPacman;
	}
	public void setInicioPacman(String inicioPacman) {
		this.inicioPacman = inicioPacman;
	}

	@XmlAttribute
	public String getInicioFantasmas() {
		return inicioFantasmas;
	}
	public void setInicioFantasmas(String inicioFantasmas) {
		this.inicioFantasmas = inicioFantasmas;
	}	

	
//	@XmlAttribute	
//	public String getInicioPacman() {
//		return PosicionAdapter.adapt(this.laberinto.getPosInicialPacman());
//	}
//	public void setInicioPacman(String inicioPacman) {
//		this.laberinto.setNodoInicialPacman(this.laberinto.getNodo(inicioPacman));
//	}
//
//	@XmlAttribute
//	public String getInicioFantasmas() {
//		return PosicionAdapter.adapt(this.laberinto.getPosInicialFantasma());
//	}
//	public void setInicioFantasmas(String inicioFantasmas) {
//		this.laberinto.setNodoInicialFantasma(this.laberinto.getNodo(inicioFantasmas));
//	}

	@XmlElementRef
	public List<XmlNodo> getNodos() {
		
		return nodos;
		
//		List<XmlNodo> xmlNodos = new ArrayList<XmlNodo>();
//		
//		for (Nodo nodo : this.laberinto.getNodos()) {
//			xmlNodos.add(new XmlNodo(nodo));
//		}
//		
//		return xmlNodos;
	}
	public void setNodos(List<XmlNodo> nodos) {
		this.nodos = nodos;
	}
	
	
	private void actualizarNodosEnLaberinto() {
		for (XmlNodo xmlNodo : nodos) {
			this.laberinto.addNodo(xmlNodo.getId(), xmlNodo.getNodo());
		}
		
		for (XmlNodo xmlNodo : nodos) {
			for (Sentido sentido : Sentido.getTodosLosSentidos()) {
				if (xmlNodo.getVecino(sentido) != null) {
					this.laberinto.getNodo(xmlNodo.getId()).setVecino(sentido, this.laberinto.getNodo(xmlNodo.getVecino(sentido)));
				}
			}
		}
	}
	
	public Laberinto getLaberinto() {
		actualizarNodosEnLaberinto();
		this.laberinto.setNodoInicialFantasmas(this.laberinto.getNodo(this.inicioFantasmas));
		this.laberinto.setNodoInicialPacman(this.laberinto.getNodo(this.inicioPacman));
		return this.laberinto;
	}
	



}




